'use strict';


//引入模块
let {Sequelize,DataTypes} = require('sequelize');
let {database,username,password,host,dialect} = require('./config')

//初始化sequelize实例
let sequelize = new Sequelize(database,username,password,{
    host:host,
    dialect:dialect
})

//创建方法包装模型定义
function DefindModle(name,attrs){
    //定义一个空对象，放所有的属性
    let porp = {};
    //模型的id
    porp.id={
        type:DataTypes.BIGINT,   //数据类型
        primaryKey:true,         //主键
        autoIncremeent:true      //自增
    };
    //循环遍历外部传入的模型属性，传入空对象
    for(let item in attrs){
        let value = attrs[item];
        attrs[item] = value;
    };
    //模型创建时间
    porp.createAt={
        type:DataTypes.BIGINT,
        allowNull:false          //是否为空
    };
    //模型更新时间 
    porp.updateAt={
        type:DataTypes.BIGINT,
        allowNull:false
    };
    //备注
    porp.remarks={
        type:DataTypes.STRING,
        allowNull:true
    };

    //利用sequelize实例定义模型
    let object = sequelize.define(name,porp,{
        tableName:name,      //强制表名和模型名一致
        timestamps:false,    //不自动创建模型的时间戳
        //钩子函数
        hooks:{
            //在插入或更新数据之前先触发钩子函数，给createAt和updateAt赋值
            beforeValidate:function(object){
                //获取当前时间
                let nowTime = Date.now();
                //如果是新的记录，插入数据
                if(object.isNewRecord){
                    object.createAt = now;
                    object.updateAt = now;
                }
                else{
                    object.updateAt = now;
                }
            }
        }
    });
    return object;
}


//创建对象，传sequelize实例和模型定义DefindModle函数和内置数据类型
let obj = {
    sequelize,
    DefindModle,
    DataTypes
};

//暴露
module.exports = obj;